deterministic finite automaton